use serde::{Deserialize, Serialize};
use  csv::{Reader};
use serde_json::Value;   // 应该是 JSON Value

use std::fs;

use crate::cli::csv::OutputFormat;


#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct Player{
    name: String,
    position: String,
    #[serde(rename = "DOB")]
    dob: String,
    nationality: String,
    #[serde(rename = "Kit Number")]
    kit_number: u8,
}


pub fn process_csv(input: &str, output: String, format: OutputFormat ) ->  Result<(), anyhow::Error> {

    let mut rdr = Reader::from_path(input)?;

    let mut ret: Vec<Value> = Vec::with_capacity(32);
    let headers = rdr.headers()?.clone();  // 后面 会再用一下 rdr ， 这个导致2 次 borrow 了
   // println!("headers {:?}", headers);  自己就会提取一下  头部

    for result  in rdr.records() {
        let record = result?.clone();
     //    println!("single record {:?}", record);

     // headers.iter()  使用迭代器   ， zip 是将2个迭代器合并 为一个的迭代器  [（header, record） ....]
     // collect<Value>  是将 迭代器 收集为一个 serde_json::Value

     // 解决toml  类型不支持的问题， 它可能 不能直接 用Value,  toml的问题暂时解决不了， 先不支持toml的生成吧。 毕竟 这个不是重点， 有时间再说吧, 也就是目前 只支持 json 和 yaml
        // let iter = headers.iter().zip(record.iter());
        // let json_value: Value = match format {
        //     OutputFormat::Json | OutputFormat::Yaml => iter.collect::<Value>(),
        //   //  OutputFormat::Toml => iter.collect::<TomlValue>(),
        //     // OutputFormat::Toml => {
        //     //     let map: serde_json::Map<String, Value> = iter.map(|(k, v)| (k.to_string(), Value::String(v.to_string()))).collect();
        //     //     Value::Object(map)
        //     // }
        // };

        let json_value = headers.iter().zip(record.iter())
        .collect::<Value>();
           ret.push(json_value);
       
    }

    let content = match format {
        OutputFormat::Json => serde_json::to_string_pretty(&ret)?,
        
        OutputFormat::Yaml => serde_yaml::to_string(&ret)?,
        OutputFormat::Toml => toml::to_string(&ret)?,
        
    };

    //let json: String = serde_json::to_string_pretty(&ret)?;
    fs::write(output, content)?;

    Ok(())

}